package com.example.handlerdemo;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
private Handler mHandler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }
    private void initView(){
        Button btnSendMsgToMain=findViewById(R.id.send_massage);
        btnSendMsgToMain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击向主线程发送消息
                sengMsgToMain();
            }
        });
        //创建主线程handler
        //handler构造方法中通过looper的静态方法，传入谁的looper
        //即是谁的handler
        //Looper.getMainLooper()获取主线程的looper
        //Looper.myLooper()获取当前线程的looper,如果当前线程没有looper,则为其创建looper
        //故Handler可以为主线程的Handler,也可以为子线程的Handler

        mHandler=new Handler(Looper.myLooper()){
            @Override
            public void handleMessage(@NonNull Message msg) {
                super.handleMessage(msg);
                //通过Massage.what字段，区分不同来源的消息
                switch (msg.what){
                    case 0xf1:
                        String text=(String) msg.obj;
                        Toast.makeText(MainActivity.this,"主线程收到："+text,Toast.LENGTH_SHORT).show();
                        break;

                }
            }
        };
    }
    private void  sengMsgToMain(){
        new Thread(){
            @Override
            public void run() {
                super.run();
                for (int i=0;i<5;i++){
          /*          //创建消息
                    Message message=new Message();
                    //消息标识，用于区分是哪个子线程发送的消息Looper.myLooper()
                    message.what=0xf1;
                    //附带数据
                    message.obj="来自子线程的消息"+i;
                    //立即发送消息
                    mHandler.sendMessage(message);*/
                    //发送消息方法2   获取MessageQueen中闲置的消息（处理后还未被回收的Message对象）
                    Message message1=mHandler.obtainMessage();
                    message1.what=0xf1;
                    message1.obj="来自子线程的消息"+i;
                    message1.sendToTarget();
                }
            }
        }.start();
    }
}